package com.example.gulimall.product;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
/*
   整合Mybatis-plus
   1.导入依赖

    2.配置
        1.配置数据源
            导入驱动
            在application.yml中配置数据源
        2.配置mybatis-plus
            1.@MapperScan进行扫描
            2.告诉mabatis-plus配置在哪里

    逻辑删除：不是真正意义上的删除，而是修改某一位
    1.设置Bean
    2.配置组件
    3.给Bean加上逻辑删除注解@TableLogic

    数据校验：JSR303校验
    1.给Bean添加校验注解 javax.validation.constraint 并定义message提示
    2.开启校验功能@valid (效果：如果报错会给错误信息)
    3.给校验Bean后紧跟BindingrResult,就可以获取校验结果
    4.分组校验：比如说保存和新增 他们的校验情况不一样(多场景的复杂校验)
        1.标注什么情况需要校验@NotBlank(message = "品牌名必须要提交",groups = {UpdateGroup.class, AddGroup.class})
        2.在controller上标注@Validated({AddGroup.class})
        3.默认没有指定分组的校验注解@NotBlank，在分组情况下不生效，只会在@Validated生效

    5.自定义校验
        1.编写一个自定义的校验注解
        2.编写一个自定义的校验器
        3.关联校验注解和校验器
            ListValueConstraintValidator.java和ListValue.java

    统一异常处理
    @ControllerAdvice
    1.编写异常处理类，使用@ControllerAdvice
    2.使用@ExceptionHandler标注方法可以处理的异常

    thymeleaf:
    1. 关闭缓存，实现实时刷新
    2. 静态资源放在static文件夹下
    3. 页面放在temlates下，访问项目的时候默认会找index
    4. 热加载 dev-tools

    整合redis
    1. 引入redis
    2. 简单配置redis
    3. 使用stringRedisTemplate
    
    整合redisson
    1. 引入依赖
    2. 配置redission
    3. 参照文档使用

    整合spring cache简化缓存开发
    1. 引入依赖 spring boot stater cache
    2. 写配置
        2.1 自动配置了哪些：CacheAutoConfiguration会导致RedisCacheConfiguration自动配置好CacheManager
        2.2 配置使用redis作为缓存
        2.3 测试使用缓存
        @Cacheable(缓存区)：将数据保存到缓存，如果缓存中有，则方法不调用，否则调用并将方法的结果放入缓存。
        @CacheEvict：删除缓存
        @CachePut：不影响方法执行更新缓存
        @Caching:组合以上多个操作
        @CacheConig：在类级别共享缓存的相关配置

    3.开启缓存：在微服务上面加EnableCaching，接下来直接使用注解就好
* */

@EnableCaching
@EnableRedisHttpSession
@EnableFeignClients(basePackages = "com.example.gulimall.product.feign")
@EnableDiscoveryClient
@MapperScan("com.example.gulimall.product.dao")
@SpringBootApplication
public class GulimallProductApplication {

    public static void main(String[] args) {
        SpringApplication.run(GulimallProductApplication.class, args);
    }

}
